import router from "@/router";
import { useUserStore } from "@/stores/counter";
import { getCurrentInstance } from 'vue';
import axios from "axios"

// URL地址
const baseURL = "http://127.0.0.1:8080"

const instance = axios.create({
    baseURL,
    timeout: 10000
})

// 请求拦截器
instance.interceptors.request.use(
    (config) => {
        if (config.url === '/login') {
            config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
            // 如果需要把参数转成 URLEncoded 格式，可以这样处理
            config.data = new URLSearchParams(config.data).toString();
            config.withCredentials = true;
        }
        // TODO 2. 携带token
        const useStore = useUserStore()
        if (useStore.accessToken) {
            config.headers.Authorization = 'Bearer ' + useStore.accessToken
        }
        return config
    },
    (err) => Promise.reject(err)
)

// 响应拦截器
instance.interceptors.response.use(
    (res) => {
        // TODO 4. 摘取核心响应数据
        if (res.data.code === 200) {
            return res
        }
        // TODO 3. 处理业务失败
        // 处理业务失败, 给错误提示，抛出错误
        ElMessage.error(res.data.msg || '服务异常')
        return Promise.reject(res.data)
    },
    async (err) => {
        // TODO 5. 处理401错误
        // 错误的特殊情况 => 401 权限不足 或 token 过期 => 拦截到登录
        const userStore = useUserStore();
        if (err.response?.status === 401) {
            try {
                // 刷新token
                await userStore.refreshTokens();
                err.config.headers.Authorization = 'Bearer ' + userStore.accessToken;
                return axios(err.config);
            } catch (refreshError) {
                userStore.removeTokens();

                // 获取当前实例并关闭 WebSocket 连接
                try {
                    const { appContext } = getCurrentInstance();
                    const socketApi = appContext.config.globalProperties.$wsApi;
                    if (socketApi) {
                        socketApi.close();
                    } 
                } catch (e) {
                    console.error('关闭 WebSocket 连接失败', e);
                }
                router.push('/login');
            }
        }

        // 错误的默认情况 => 只要给提示
        ElMessage.error(err.response.data.msg || '服务异常')
        return Promise.reject(err)
    }
)

export default instance
export {
    baseURL
}